#pragma once

#include <iostream>
#include <ctemplate/template.h>
#include <vector>

//#include "oj_model.hpp"
#include "oj_model2.hpp"

namespace ns_view
{   
    static const std::string template_path="./template_html/";
    class View
    {
    public:
        View() {}
        ~View() {}

        /* 
        
        class Question
        {
        public:
            std::string number; // 题目编号,唯一
            std::string title;  // 题目标题
            std::string star;   // 难度:简单 中等 困难
            int cpu_limit;      // 时间要求
            int mem_limit;      // 空间要求 (kb)
            std::string desc;   // 题目的描述 (discribe)
            std::string header; // 题目预设给用户的在线编辑器的代码 (Leetcode) 中给出的接口
            std::string tail;   // 题目的测试用例,需要和header 拼接,形成完整代码
        };

         */

        void AllExpandHtml(const std::vector<ns_model::Question>&questions,std::string *html)
        {
            // 题目编号 题目的标题 题目的难度

            // 形成路径
            std::string src_html = template_path + "all_questions.html";

            // 形成数据字典
            ctemplate::TemplateDictionary root("all_questions");
            for(const auto& e:questions)
            {
                // 在root下形成一个子字典                                //! ???????????
                ctemplate::TemplateDictionary* sub = root.AddSectionDictionary("question_list"); 
                sub->SetValue("number",e.number);
                sub->SetValue("title",e.title);
                sub->SetValue("star",e.star);
                sub->SetValue("cpu_limit",std::to_string(e.cpu_limit));
                sub->SetValue("mem_limit",std::to_string(e.mem_limit));
            }
            // 获取被渲染的 html
            ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);
            // 开始完成渲染功能
            tpl->Expand(html,&root);

            //tpl->Expand(html,nullptr);
        }

        void AllExpandHtml_1(const std::vector<ns_model::Question>&questions ,std::string *html)
        {
            // 题目编号 题目的标题 题目的难度

            // 形成路径
            std::string src_html = template_path + "all_questions1.html";

            // 形成数据字典
            ctemplate::TemplateDictionary root("all_questions");
            for(const auto& e:questions)
            {
                // 在root下形成一个子字典                                //! ???????????
                ctemplate::TemplateDictionary* sub = root.AddSectionDictionary("question_list"); 
                sub->SetValue("number",e.number);
                sub->SetValue("title",e.title);
                sub->SetValue("star",e.star);
                sub->SetValue("cpu_limit",std::to_string(e.cpu_limit));
                sub->SetValue("mem_limit",std::to_string(e.mem_limit));
                sub->SetValue("success_count",std::to_string(e.success_count));

                if(e.success_count <30 )
                sub->SetValue("bg_color","layui-bg-red");
                else if( e.success_count <70)
                sub->SetValue("bg_color","layui-bg-orange");
                else
                sub->SetValue("bg_color","");
                
            }
            // 获取被渲染的 html
            ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);
            // 开始完成渲染功能
            tpl->Expand(html,&root);
        }

        // void AllExpandHtml(const std::vector<ns_model::Question>&questions ,std::string *html)
        // {
        //     // 题目编号 题目的标题 题目的难度

        //     // 形成路径
        //     std::string src_html = template_path + "all_questions.html";

        //     // 形成数据字典
        //     ctemplate::TemplateDictionary root("all_questions");
        //     for(const auto& e:questions)
        //     {
        //         // 在root下形成一个子字典                                //! ???????????
        //         ctemplate::TemplateDictionary* sub = root.AddSectionDictionary("question_list"); 
        //         sub->SetValue("number",e.number);
        //         sub->SetValue("title",e.title);
        //         sub->SetValue("star",e.star);
        //     }
        //     // 获取被渲染的 html
        //     ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);
        //     // 开始完成渲染功能
        //     tpl->Expand(html,&root);
        // }



        void OneExpandHtml(const ns_model::Question& q,std::string *html)
        {
            // 形成路径
            std::string src_html = template_path+"one_questions.html";
            
            // 形成数据字典
            ctemplate::TemplateDictionary root("one_question");
            root.SetValue("number",q.number);
            root.SetValue("title",q.title);
            root.SetValue("star",q.star);
            root.SetValue("desc",q.desc);
            root.SetValue("pre_code",q.header);  //预设代码
            root.SetValue("data_range",q.data_range); 

            //获取被渲染的html
            ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);

            // 开始完成渲染功能
            tpl->Expand(html,&root);

        }

    };
}